package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dao.MenuDao;
import com.itheima.pojo.Menu;
import com.itheima.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author wgq
 * @date 2019-10-19 22:53
 * 动态获取菜单栏，业务层
 */
@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuDao menuDao;
    /**
     * 获取菜单栏
     * @return
     */
    @Override
    public List<Map> findMenuList(String username) {
        List<Menu> menuList = menuDao.findMenuList(username);
        return findByParentId(menuList,null);  //查询一级菜单
    }

    /**
     * 进行递归，组装菜单List
     * @param menuList
     * @param parentId
     * @return
     */
    private List<Map> findByParentId(List<Menu> menuList, Integer parentId) {
        List<Map> result = new ArrayList<Map>();
        /*遍历所有菜单，然后一级菜单的parentId注定都是null,所以parentId传过来为null
        遍历的时候，当双方都是null时，查出了一级菜单，假如map，到children时，进行递归，
        此时传过来的仍然是所有菜单，但是第二个参数parentId为当前递归的菜单的ID，此时
        再进行if判断，哪些菜单的parentId如果是传过来的parentId一致时，进行map组装，依次递归结束后，
        返回的仍然是个List给最外层的children的value值赋值，所以，以此类推，最终得到所有数据
        */
        for (Menu menu : menuList) {
            Integer pid = menu.getParentMenuId();
            if(pid == null){
                pid = 0;
            }
            if(parentId == null){
                parentId = 0;
            }
            if(parentId.equals(pid)){
                Map map = new HashMap();
                map.put("path",menu.getPath());
                map.put("title",menu.getName());
                map.put("icon",menu.getIcon());
                map.put("linkUrl",menu.getLinkUrl());
                //System.out.println(menu.getId());
                System.out.println(menu.getParentMenuId());
                map.put("children",findByParentId(menuList,menu.getId()));
                result.add(map);
            }
        }
        return result;
    }
}
